package leetCode.Test1;

/**
 * @author zwei
 * @create 2024-07-29 19:06
 */
public class minSubArrayLen {
    //给定一个含有 n 个正整数的数组和一个正整数 target 。
    //找出该数组中满足其总和大于等于 target 的长度最小的
    //子数组
    // [numsl, numsl+1, ..., numsr-1, numsr] ，并返回其长度。如果不存在符合条件的子数组，返回 0 。
    public static void main(String[] args) {
        minSubArrayLen a=new minSubArrayLen();
        int[]nums={1,2,3,4,5};
        int target=11;
        int result=a.minSubArrayLen(target,nums);
        int result1=a.minSubArrayLen1(target,nums);
        System.out.println(result+"\t"+result1);
    }
    //暴力法
    public int minSubArrayLen(int target, int[] nums) {
        int n=nums.length;
        if (n==0){
            return 0;
        }
        int ans=Integer.MAX_VALUE;
        for (int i=0;i<n;i++){
            int sum=0;
            for (int j=i;j<n;j++){
                sum+=nums[j];
                if (sum>=target){
                    ans=Math.min(ans,j-i+1);
                    break;
                }
            }
        }
        return ans ==Integer.MAX_VALUE? 0 : ans;
    }
    //滑动窗口法
    public int minSubArrayLen1(int target, int[] nums) {
        int n=nums.length;
        if (n==0){
            return 0;
        }
        int ans=Integer.MAX_VALUE;
        System.out.println(ans);
        int start=0,end=0;
        int sum=0;
        while (end<n){
            sum+=nums[end];
            while (sum>=target){
                ans=Math.min(ans,end-start+1);
                sum-=nums[start];
                start++;
            }
            end++;
        }
        return ans ==Integer.MAX_VALUE? 0 : ans;
    }
}
